package ar.edu.utn.frba.dds.tp.code.adapter;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import org.joda.time.LocalTime;
import org.joda.time.format.DateTimeFormat;

import ar.edu.utn.frba.dds.tp.code.Asientos.AsientoDeVuelo;
import ar.edu.utn.frba.dds.tp.code.Asientos.ClaseAsiento;
import ar.edu.utn.frba.dds.tp.code.Asientos.EstadoAsiento;
import ar.edu.utn.frba.dds.tp.code.Asientos.UbicacionAsiento;
import ar.edu.utn.frba.dds.tp.code.dateParser.FormatoSimple;
import ar.edu.utn.frba.dds.tp.code.dateParser.ParserFecha;
import ar.edu.utn.frba.dds.tp.code.vuelos.Busqueda;
import ar.edu.utn.frba.dds.tp.code.vuelos.Vuelo;
import ar.edu.utn.frba.dds.tp.homes.AsientosHome;
import ar.edu.utn.frba.dds.tp.homes.VuelosHome;

public class LanchitaConversor extends AbstractConversor{

	public String convertirAString(AsientoDeVuelo asiento) {
		return asiento.getCodigoDeVuelo() + "-" + asiento.getNumeroDeAsiento();
	}

	public AsientoDeVuelo convertirAsiento(String[] infoDeAsiento) {

		Lanchita asientoLanchita = this.getAsientoLanchita(infoDeAsiento);
		Vuelo vuelo ;
		
		List<Vuelo> existencias = VuelosHome.getInstance()
				.search(
						this.convertirACodigoVuelo(asientoLanchita.getCodigoAsiento()),
						asientoLanchita.getOrigenVuelo(),
						asientoLanchita.getDestinoVuelo());
		if(existencias.isEmpty()){
			vuelo = new Vuelo(this.convertirACodigoVuelo(asientoLanchita.getCodigoAsiento()),
					asientoLanchita.getOrigenVuelo(),
					asientoLanchita.getDestinoVuelo(),
					ParserFecha.Parsear(asientoLanchita.getFechaSalida(), FormatoSimple.LATINOAMERICANO),
					ParserFecha.Parsear(asientoLanchita.getFechaLlegada(), FormatoSimple.LATINOAMERICANO),
					LocalTime.parse(asientoLanchita.getHorarioSalida(),DateTimeFormat.forPattern("HH:mm")),
					LocalTime.parse(asientoLanchita.getHorarioLlegada(),DateTimeFormat.forPattern("HH:mm"))
					);
			//TODO en la próxima iteración, generar el Parser para horas. Hay que mimar el que tenemos hecho.
			VuelosHome.getInstance().create(vuelo);
		} else {
			vuelo = existencias.get(0);
		}

		
		String precio = asientoLanchita.getPrecioBase();
		ClaseAsiento clase = this.generarClaseDeAsiento(asientoLanchita.getClase());
		UbicacionAsiento ubicacion = this.generarUbicacionDeAsiento(asientoLanchita.getUbicacion());
		EstadoAsiento estado = this.generarEstadoDeAsiento(asientoLanchita.getEstado());
		int nroAsiento = this.convertirANumeroDeAsiento(asientoLanchita.getCodigoAsiento());
		AsientoDeVuelo asiento = new AsientoDeVuelo(nroAsiento,				//numero de asiento 
													new BigDecimal(precio),	//precio
													clase, 					//clase
													ubicacion, 				//ubicacion
													estado);				//estado
		List<AsientoDeVuelo> asientosExistentes = AsientosHome.getInstance()
				.search(asiento);
		if (asientosExistentes.isEmpty())
			asiento.setVueloYCodigo(vuelo);
		else 
			asiento = asientosExistentes.get(0); 
		return asiento;
	}

	private Lanchita getAsientoLanchita(String[] infoDeAsiento) {
		Lanchita asientoLanchita = new Lanchita();
		asientoLanchita.setCodigoAsiento(infoDeAsiento[0]);
		asientoLanchita.setPrecioBase(infoDeAsiento[1]);
		asientoLanchita.setClase(infoDeAsiento[2]);
		asientoLanchita.setUbicacion(infoDeAsiento[3]);
		asientoLanchita.setEstado(infoDeAsiento[4]);
		asientoLanchita.setDni(infoDeAsiento[5]);
		asientoLanchita.setHorarioSalida(infoDeAsiento[6]);
		asientoLanchita.setHorarioLlegada(infoDeAsiento[7]);
		asientoLanchita.setOrigenVuelo(infoDeAsiento[8]);
		asientoLanchita.setDestinoVuelo(infoDeAsiento[9]);
		asientoLanchita.setFechaSalida(infoDeAsiento[10]);
		asientoLanchita.setFechaLlegada(infoDeAsiento[11]);
		return asientoLanchita;
	}
	
	//Formato "CodigoAvion-NumeroAsiento"
	public String convertirACodigoVuelo(String string) { 
		String[] splitted = string.split("-");
		String codigo = splitted[0];
		return codigo;
		
	}
	//Formato "CodigoAvion-NumeroAsiento"
	public int convertirANumeroDeAsiento(String string) {
		String[] splitted = string.split("-");
		String codigo = splitted[1];
		return new Integer(codigo);
	}

	public Lanchita parsearBusqueda(Busqueda busqueda) {
		
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
		
		Lanchita lanchita = new Lanchita();
		lanchita.setOrigenVuelo(busqueda.getOrigen().getLugar());
		lanchita.setDestinoVuelo(busqueda.getDestino().getLugar());
		lanchita.setFechaSalida(simpleDateFormat.format(busqueda.getFechaSalida()));
		lanchita.setHorarioSalida(null);
		lanchita.setHorarioLlegada(null);
		lanchita.setFechaLlegada(null);
		
		return lanchita;
	}
}
